package main

import "fmt"

func main() {
	test_select()
}

func test_select() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	go func() {
		ch1 <- 1
		ch2 <- 2
	}()
	// 没有while, 无限循环用 for {...}
	// for {}
	select {
	case <-ch1:
		fmt.Println("ch1")
	case <-ch2:
		fmt.Println("ch2")
	}
}
func test_switch() {
	type Gender int8
	const (
		MALE   Gender = 1
		FEMALE Gender = 2
	)

	gender := MALE

	switch gender {
	case FEMALE:
		fmt.Println("female")
	case MALE:
		fmt.Println("male")
	default:
		fmt.Println("unknown")
	}
}
func test_func() {
	var a int = 10
	increment := func(num int) {
		num += 1
	}
	increment(a)
	fmt.Println(a) // 10
	incrementPointer := func(num *int) {
		*num += 1
	}
	incrementPointer(&a)
	fmt.Println(a) // 11
}

func test_pointer() {
	str := "Golang"
	// str 的指针  &str
	// p 是一个指针类型，指向 str 的内存地址
	// *p 解引用指针，得到 str 的值
	// 指针 转值,  &str --> *(&str)
	var p *string = &str // p 是指向 str 的指针
	fmt.Println(*p)
	fmt.Println(&p)
	fmt.Println(p)
	*p = "Python"
}
func test_map() {
	m1 := make(map[string]int)
	m2 := map[string]string{
		"name": "Alice",
		"age":  "25",
	}
	m1["action"] = 1
	fmt.Println(m1, m2)
}
func slice_demo() {
	slice1 := make([]float32, 0)
	slice1 = append(slice1, 1.1, 2.2, 3.3)
	slice2 := make([]float32, 3, 5) // [0,0,0]
	// 声明切片时可以为切片设置容量大小，为切片预分配空间。
	// 在实际使用的过程中，如果容量不够，切片容量会自动扩展。

	slice2 = append(slice2, 1, 2, 3, 4)
	fmt.Println(len(slice2), cap(slice2)) // 7 12
	fmt.Println(slice1)                   // [1.1 2.2 3.3]
	fmt.Println(slice2)                   // [0 0 0 1 2 3 4]
	sub1 := slice2[2:]                    // [0 1 2 3 4]
	sub2 := slice2[1:3]                   // [0 0]
	fmt.Println(sub1, sub2)
	combined := append(sub1, sub2...)
	fmt.Println(combined) // [0 1 2 3 4 0 0]
}

func arr_define() {
	var arr1 [5]int
	var arr [5]int = [5]int{1, 2, 3, 4, 5}
	var arr2 [5][5]int
	arr2[0] = arr
	fmt.Println(arr2)
	arr2[1][2] = 100
	for i := 0; i < len(arr); i++ {
		arr[i] += 100
	}
	fmt.Println(arr)
	fmt.Println(arr2, "\n", arr1)
}

// Output:
// [[1 2 3 4 5] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
// [[1 2 3 4 5] [0 0 0 0 0] [0 0 100 0 0] [0 0 0 0 0] [0 0 0 0 0]]
func arrayDemo() {
	// Declare an array of integers
	var arr [5]int
	// Initialize the array with values
	arr[0] = 10
	arr[1] = 20
	arr[2] = 30
	arr[3] = 40
	arr[4] = 50
	// Accessing the elements of the array
	for i := 0; i < len(arr); i++ {
		println(arr[i])
	}
}

// Output:
// 10
// 20
// 30
// 40
// 50
func test_interview() {
	slice := []int{0, 1, 2, 3}
	m := make(map[int]*int)

	for key, val := range slice {
		// m[key] = &val
		value := val
		m[key] = &value
	}
	fmt.Println(slice)
	fmt.Println(m)

	for k, v := range m {
		fmt.Println(k, "->", *v)
	}
	// go 1.25
	// Output:
	// [0 1 2 3]
	// map[0:0xc00008c060 1:0xc00008c068 2:0xc00008c070 3:0xc00008c078]
	// 0 -> 0
	// 1 -> 1
	// 2 -> 2
	// 3 -> 3
}
